package com.tenbit.bns.svc;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.tenbit.bns.dao.BonusEDAO;
import com.tenbit.bns.dao.BonusQ1000DAO;
import com.tenbit.bns.vo.BonusVO;
import com.tenbit.com.vo.ErrorMsgVO;

@Service
public class BNS1000SVCImpl implements BNS1000SVC{
	@Autowired
	private BonusQ1000DAO bonusQ1000DAO;
	@Autowired
	private BonusEDAO bonusEDAO;
	@Autowired
	private BNS1000SVC bns1000svc;
	
	Logger log = Logger.getLogger(this.getClass());
	
	/**
	* 화면의 오른쪽 grid의 데이터를 입력,수정,삭제를 실행하는 함수
	* @param list - 데이터 리스트
	* @return  실행 결과
	* @throws 
	*/	
	@Override
	public boolean exeBonus(List<Map<String, Object>> list) {
		
		log.debug("=======start: "+this.getClass().getName()+"."+new Exception().getStackTrace()[0].getMethodName()
				+"=======");
		
		for (Map<String, Object> map : list) {
			if(map.get("CRUD").equals("C")){  //입력을 위한 데이터
				
				BonusVO vo = new BonusVO();
				
				vo.setEmployeeId((String)map.get("EMPLOYEE_ID"));
				vo.setBonusCode((String)map.get("BONUS_CODE"));
				vo.setPaymentDate((String)map.get("PAYMENT_DATE"));
				vo.setBonusSum(new BigDecimal((String)map.get("BONUS_SUM")));
				
				//TODO: PK 중복값 체크
				try {
					bonusEDAO.insertBonus(vo);
					
				} catch (Exception e) {
					// TODO: handle exception
					e.printStackTrace();
					
				}
				
			}else if(map.get("CRUD").equals("U")){	//수정을 위한 데이터
	
				log.debug("u "+map);
				
				Map<String, Object> paraMap = new HashMap<String, Object>();
				
				BonusVO set = new BonusVO();
				BonusVO where = new BonusVO();
				
				//PK 리스트 : EMPLOYEE_ID, PAYMENT_DATE, BONUS_CODE
				List<String> pkList = (List<String>)map.get("PK"); 
				
				//UPDATE 문장의 SET부분 설정
				set.setBonusCode((String)map.get("BONUS_CODE"));
				set.setPaymentDate((String)map.get("PAYMENT_DATE"));
				set.setBonusSum(new BigDecimal((String)map.get("BONUS_SUM")));
				
				//UPDATE 문장의 WHERE부분 설정
				where.setEmployeeId(pkList.get(0));
				where.setPaymentDate(pkList.get(1));
				where.setBonusCode(pkList.get(2));
				
				paraMap.put("set", set);
				paraMap.put("where", where);
				
				bonusEDAO.updateBonus(paraMap);
							
			}else if(map.get("CRUD").equals("D")){	//삭제를 위한 데이터

				BonusVO vo = new BonusVO();
				
				List<String> pkList = (List<String>)map.get("PK");
				vo.setEmployeeId(pkList.get(0));
				vo.setPaymentDate(pkList.get(1));
				vo.setBonusCode(pkList.get(2));
				
				bonusEDAO.deleteBonus(vo);
			}
		}
		
		log.debug("=======end: "+this.getClass().getName()+"."+new Exception().getStackTrace()[0].getMethodName()
				+"=======");
		
		return true;
	}

	/**
	* 화면의 오른쪽 grid의 검색 결과를 list형태로 돌려준다.
	* @param paraMap - 검색 조건들
	* @return  검색 결과
	* @throws 
	*/
	@Override
	public List<Map<String, Object>> listBonus(Map<String, Object> paraMap) {
		List<Map<String, Object>> list = bonusQ1000DAO.listBonus(paraMap);
		
		return list;
	}

	/**
	* 화면의 오른쪽 grid의 폼을 검증하는 함수
	* @param formMap - 검색폼들의 값
	* @return  검증 결과
	* @throws 
	*/	
	@Override
	public ErrorMsgVO doValidateForm(List<Map<String, Object>> formMap) {
		
		ErrorMsgVO errMsg = new ErrorMsgVO();
		
		for (Map<String, Object> map : formMap) {
			
			if( map.get("PAYMENT_DATE").equals("") ){
				errMsg.setErrMsg("날짜를 입력해 주세요");
				errMsg.setErrExist(true);
				
				return errMsg;
			}
			
			if( map.get("BONUS_CODE").equals("") ){
				errMsg.setErrMsg("보너스 종류를 입력해 주세요");
				errMsg.setErrExist(true);
				
				return errMsg;
			}
			
			if( map.get("BONUS_SUM").equals("") ){
				errMsg.setErrMsg("보너스 금액을 입력해 주세요");
				errMsg.setErrExist(true);
				
				return errMsg;
			}
			
		}
		
		return errMsg;
	}
	
}
